package com.zhaoyu.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhaoyu.common.constants.UserConstants;
import com.zhaoyu.model.article.pojos.ApAuthor;
import com.zhaoyu.model.common.dtos.PageResponseResult;
import com.zhaoyu.model.common.dtos.ResponseResult;
import com.zhaoyu.model.common.enums.AppHttpCodeEnum;
import com.zhaoyu.model.media.pojos.WmUser;
import com.zhaoyu.model.user.dtos.AuthDto;
import com.zhaoyu.model.user.pojos.ApUser;
import com.zhaoyu.model.user.pojos.ApUserRealname;
import com.zhaoyu.user.feign.article.ArticleFeign;
import com.zhaoyu.user.feign.wemedia.WemediaFeign;
import com.zhaoyu.user.mapper.ApUserMapper;
import com.zhaoyu.user.mapper.ApUserRealNameMapper;
import com.zhaoyu.user.service.ApUserRealNameService;
//import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.Date;

/**
 * IService 实现类（泛型：M 是 mapper 对象，T 是实体）
 */
@Service
public class ApUserRealNameServiceImpl extends ServiceImpl<ApUserRealNameMapper,ApUserRealname> implements ApUserRealNameService {

    @Autowired
    private ApUserMapper apUserMapper;

    @Autowired
    private WemediaFeign wemediaFeign;

    @Autowired
    private ArticleFeign articleFeign;

    @Override
    public ResponseResult findByStatusAndPage(AuthDto authDto) {
        /**
         * 请求参数是null，默认查第一页
         */
        if (authDto == null){
            authDto = new AuthDto();
            // return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        /**
         * 获取默认的分页信息
         */
        authDto.checkParam();
        /**
         * 分页查询
         * eq(column,val)
         * column 字段(实体类) val 值(DTO)
         */
        Page page = new Page<ApUserRealname>(authDto.getPage(),authDto.getSize());
        LambdaQueryWrapper<ApUserRealname> wrapper = new LambdaQueryWrapper<>();
        if (!StringUtils.isEmpty(authDto.getStatus())){
            wrapper.eq(ApUserRealname::getStatus,authDto.getStatus()); // ApUserRealname::getStatus：状态
        }
        IPage result = page(page,wrapper);
        /**
         * 当前页(默认第一页)：getCurrent
         * 当前页总页数：getSize
         * 总条数：getTotal
         * 分页对象记录列表：getRecords
         * 封装结果
         */
        ResponseResult responseResult = new PageResponseResult((int) result.getCurrent(),(int) result.getSize(),(int) result.getTotal());
        responseResult.setData(result.getRecords());
        return responseResult;
    }

    @Override
    @Transactional // 本地事务
    // @GlobalTransactional // 分布式事务
    public ResponseResult updateStatusById(AuthDto authDto,Short status) {
        /**
         * 校验参数/检查参数
         */
        if (authDto == null || authDto.getId() == null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); // 无效参数
        }
        if (statusCheck(status)){ // 校验状态(状态监测)
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); // 无效参数
        }
        /**
         * 修改状态
         * 更新审核的状态 更新ApUserRealname
         */
        ApUserRealname apUserRealname = new ApUserRealname();
        apUserRealname.setId(authDto.getId()); // 主键id
        apUserRealname.setStatus(status); // 状态 status：2审核不通过,9审核通过
        if (authDto.getMsg() != null){ // 审核不通过原因
            apUserRealname.setReason(authDto.getMsg());
        }
        updateById(apUserRealname);
        /**
         * 判断是否通过
         * 认证通过添加自媒体账号和作者账号
         */
        if (status.equals(UserConstants.PASS_AUTH)){
            // 创建自媒体账号和作者账号
            ResponseResult responseResult = createWmUserAndAuthor(authDto);
            if (responseResult != null){
                return responseResult;
            }
        }
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }

    /**
     * 创建自媒体账号和作者账号
     * 1、根据AuthDto.getId()查询ap_user_realname信息/APP实名认证信息表
     * 2、根据ApUserRealname.getUserId()查询ap_user信息/APP用户信息表
     * 3、根据ApUser.getName()查询自媒体用户信息表
     *    创建自媒体用户
     * 4、根据WmUser.getApUserId()查询APP文章作者信息表
     *    创建APP文章作者信息表
     * 5、修改ap_user/APP用户信息表里面apUser.setFlag((short) 1) // 0普通用户/1自媒体人/2大V
     */
    private ResponseResult createWmUserAndAuthor(AuthDto authDto) {
        // 添加自媒体账号,查询ap_user信息封装到wmuser中
        ApUserRealname apUserRealname = getById(authDto.getId()); // 查询ap_user_realname信息/APP实名认证信息表
        ApUser apUser = apUserMapper.selectById(apUserRealname.getUserId()); // 查询ap_user信息/APP用户信息表
        if (apUser == null){ // 查询不到ap_user信息
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); // 无效参数
        }
        WmUser wmUser = wemediaFeign.findByNameWmUser(apUser.getName()); // 查询自媒体用户信息表
        if (wmUser == null || wmUser.getId() == null){ // 自媒体用户不存在
            wmUser = new WmUser(); // 创建自媒体用户
            wmUser.setApUserId(apUser.getId()); // 自媒体用户id
            wmUser.setCreatedTime(new Date()); // 创建时间
            wmUser.setSalt(apUser.getSalt()); // 盐值
            wmUser.setName(apUser.getName()); // 用户名
            wmUser.setPassword(apUser.getPassword()); // 密码(MD5加密)
            wmUser.setStatus(9); // 标记审核通过
            wmUser.setPhone(apUser.getPhone()); // 手机号
            wemediaFeign.saveWmUser(wmUser);
        }
        // 创建作者账号
        createAuthor(wmUser);
        // 修改ap_user标记
        apUser.setFlag((short) 1); // 0普通用户/1自媒体人/2大V
        apUserMapper.updateById(apUser);
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }

    /**
     * 创建作者账号
     */
    private void createAuthor(WmUser wmUser) {
        ApAuthor apAuthor = articleFeign.findByUserIdApAuthor(wmUser.getApUserId()); // 查询APP文章作者信息表
        if (apAuthor == null){ // APP文章作者信息表不存在
            apAuthor = new ApAuthor(); // 创建APP文章作者信息表
            apAuthor.setName(wmUser.getName());
            apAuthor.setType(Integer.valueOf(UserConstants.AUTHOR_TYPE)); // 0 爬取数据、1 签约合作商、2 平台自媒体人
            apAuthor.setCreatedTime(new Date()); // 创建时间
            apAuthor.setUserId(wmUser.getApUserId()); // 自媒体用户id
            articleFeign.saveApAuthor(apAuthor);
        }
    }

    /**
     * 状态监测
     */
    private boolean statusCheck(Short status) {
        if (status == null || (!status.equals(UserConstants.FAIL_AUTH) && !status.equals(UserConstants.PASS_AUTH))) {
            // status == null或status == 5,6,7
            // 如果传过来的都不是9,2
            // 那么代表不通过,就返回true
            // 参数不合格
            return true;
        }
        // 如果传过来的都是9,2
        // 那么代表通过,就返回false
        return false; // 参数合格
    }

}